home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fritz: All Fritz
/
All Fritz.zip
/
All Fritz
/
FILES
/
PROGMISC
/
PCSSP.LZH
/
PC-SSP.ZIP
/
POLYROOT.ZIP
/
PRQD.FOR
< prev
Wrap
Text File
|
1985-11-29
|
10KB
|
388 lines
C
C ..................................................................
C
C SUBROUTINE PRQD
C
C PURPOSE
C CALCULATE ALL REAL AND COMPLEX ROOTS OF A GIVEN POLYNOMIAL
C WITH REAL COEFFICIENTS.
C
C USAGE
C CALL PRQD(C,IC,Q,E,POL,IR,IER)
C
C DESCRIPTION OF PARAMETERS
C C - COEFFICIENT VECTOR OF GIVEN POLYNOMIAL
C COEFFICIENTS ARE ORDERED FROM LOW TO HIGH
C THE GIVEN COEFFICIENT VECTOR GETS DIVIDED BY THE
C LAST NONZERO TERM
C IC - DIMENSION OF VECTOR C
C Q - WORKING STORAGE OF DIMENSION IC
C ON RETURN Q CONTAINS REAL PARTS OF ROOTS
C E - WORKING STORAGE OF DIMENSION IC
C ON RETURN E CONTAINS COMPLEX PARTS OF ROOTS
C POL - WORKING STORAGE OF DIMENSION IC
C ON RETURN POL CONTAINS THE COEFFICIENTS OF THE
C POLYNOMIAL WITH CALCULATED ROOTS
C THIS RESULTING COEFFICIENT VECTOR HAS DIMENSION IR+1
C COEFFICIENTS ARE ORDERED FROM LOW TO HIGH
C IR - NUMBER OF CALCULATED ROOTS
C NORMALLY IR IS EQUAL TO DIMENSION IC MINUS ONE
C IER - RESULTING ERROR PARAMETER. SEE REMARKS
C
C REMARKS
C THE REAL PART OF THE ROOTS IS STORED IN Q(1) UP TO Q(IR)
C CORRESPONDING COMPLEX PARTS ARE STORED IN E(1) UP TO E(IR).
C IER = 0 MEANS NO ERRORS
C IER = 1 MEANS NO CONVERGENCE WITH FEASIBLE TOLERANCE
C IER = 2 MEANS POLYNOMIAL IS DEGENERATE (CONSTANT OR ZERO)
C IER = 3 MEANS SUBROUTINE WAS ABANDONED DUE TO ZERO DIVISOR
C IER = 4 MEANS THERE EXISTS NO S-FRACTION
C IER =-1 MEANS CALCULATED COEFFICIENT VECTOR REVEALS POOR
C ACCURACY OF THE CALCULATED ROOTS.
C THE CALCULATED COEFFICIENT VECTOR HAS LESS THAN
C 3 CORRECT DIGITS.
C THE FINAL COMPARISON BETWEEN GIVEN AND CALCULATED
C COEFFICIENT VECTOR IS PERFORMED ONLY IF ALL ROOTS HAVE BEEN
C CALCULATED.
C THE MAXIMAL RELATIVE ERROR OF THE COEFFICIENT VECTOR IS
C RECORDED IN Q(IR+1).
C
C SUBROUTINES AND FUNCTION SUBPROGRAMS REQUIRED
C NONE
C
C METHOD
C THE ROOTS OF THE POLYNOMIAL ARE CALCULATED BY MEANS OF
C THE QUOTIENT-DIFFERENCE ALGORITHM WITH DISPLACEMENT.
C REFERENCE
C H.RUTISHAUSER, DER QUOTIENTEN-DIFFERENZEN-ALGORITHMUS,
C BIRKHAEUSER, BASEL/STUTTGART, 1957.
C
C ..................................................................
C
SUBROUTINE PRQD(C,IC,Q,E,POL,IR,IER)
C
C DIMENSIONED DUMMY VARIABLES
DIMENSION E(1),Q(1),C(1),POL(1)
C
C NORMALIZATION OF GIVEN POLYNOMIAL
C TEST OF DIMENSION
C IR CONTAINS INDEX OF HIGHEST COEFFICIENT
IER=0
IR=IC
EPS=1.E-6
TOL=1.E-3
LIMIT=10*IC
KOUNT=0
1 IF(IR-1)79,79,2
C
C DROP TRAILING ZERO COEFFICIENTS
2 IF(C(IR))4,3,4
3 IR=IR-1
GOTO 1
C
C REARRANGEMENT OF GIVEN POLYNOMIAL
C EXTRACTION OF ZERO ROOTS
4 O=1./C(IR)
IEND=IR-1
ISTA=1
NSAV=IR+1
JBEG=1
C
C Q(J)=1.
C Q(J+I)=C(IR-I)/C(IR)
C Q(IR)=C(J)/C(IR)
C WHERE J IS THE INDEX OF THE LOWEST NONZERO COEFFICIENT
DO 9 I=1,IR
J=NSAV-I
IF(C(I))7,5,7
5 GOTO(6,8),JBEG
6 NSAV=NSAV+1
Q(ISTA)=0.
E(ISTA)=0.
ISTA=ISTA+1
GOTO 9
7 JBEG=2
8 Q(J)=C(I)*O
C(I)=Q(J)
9 CONTINUE
C
C INITIALIZATION
ESAV=0.
Q(ISTA)=0.
10 NSAV=IR
C
C COMPUTATION OF DERIVATIVE
EXPT=IR-ISTA
E(ISTA)=EXPT
DO 11 I=ISTA,IEND
EXPT=EXPT-1.0
POL(I+1)=EPS*ABS(Q(I+1))+EPS
11 E(I+1)=Q(I+1)*EXPT
C
C TEST OF REMAINING DIMENSION
IF(ISTA-IEND)12,20,60
12 JEND=IEND-1
C
C COMPUTATION OF S-FRACTION
DO 19 I=ISTA,JEND
IF(I-ISTA)13,16,13
13 IF(ABS(E(I))-POL(I+1))14,14,16
C
C THE GIVEN POLYNOMIAL HAS MULTIPLE ROOTS, THE COEFFICIENTS OF
C THE COMMON FACTOR ARE STORED FROM Q(NSAV) UP TO Q(IR)
14 NSAV=I
DO 15 K=I,JEND
IF(ABS(E(K))-POL(K+1))15,15,80
15 CONTINUE
GOTO 21
C
C EUCLIDEAN ALGORITHM
16 DO 19 K=I,IEND
E(K+1)=E(K+1)/E(I)
Q(K+1)=E(K+1)-Q(K+1)
IF(K-I)18,17,18
C
C TEST FOR SMALL DIVISOR
17 IF(ABS(Q(I+1))-POL(I+1))80,80,19
18 Q(K+1)=Q(K+1)/Q(I+1)
POL(K+1)=POL(K+1)/ABS(Q(I+1))
E(K)=Q(K+1)-E(K)
19 CONTINUE
20 Q(IR)=-Q(IR)
C
C THE DISPLACEMENT EXPT IS SET TO 0 AUTOMATICALLY.
C E(ISTA)=0.,Q(ISTA+1),...,E(NSAV-1),Q(NSAV),E(NSAV)=0.,
C FORM A DIAGONAL OF THE QD-ARRAY.
C INITIALIZATION OF BOUNDARY VALUES
21 E(ISTA)=0.
NRAN=NSAV-1
22 E(NRAN+1)=0.
C
C TEST FOR LINEAR OR CONSTANT FACTOR
C NRAN-ISTA IS DEGREE-1
IF(NRAN-ISTA)24,23,31
C
C LINEAR FACTOR
23 Q(ISTA+1)=Q(ISTA+1)+EXPT
E(ISTA+1)=0.
C
C TEST FOR UNFACTORED COMMON DIVISOR
24 E(ISTA)=ESAV
IF(IR-NSAV)60,60,25
C
C INITIALIZE QD-ALGORITHM FOR COMMON DIVISOR
25 ISTA=NSAV
ESAV=E(ISTA)
GOTO 10
C
C COMPUTATION OF ROOT PAIR
26 P=P+EXPT
C
C TEST FOR REALITY
IF(O)27,28,28
C
C COMPLEX ROOT PAIR
27 Q(NRAN)=P
Q(NRAN+1)=P
E(NRAN)=T
E(NRAN+1)=-T
GOTO 29
C
C REAL ROOT PAIR
28 Q(NRAN)=P-T
Q(NRAN+1)=P+T
E(NRAN)=0.
C
C REDUCTION OF DEGREE BY 2 (DEFLATION)
29 NRAN=NRAN-2
GOTO 22
C
C COMPUTATION OF REAL ROOT
30 Q(NRAN+1)=EXPT+P
C
C REDUCTION OF DEGREE BY 1 (DEFLATION)
NRAN=NRAN-1
GOTO 22
C
C START QD-ITERATION
31 JBEG=ISTA+1
JEND=NRAN-1
TEPS=EPS
TDELT=1.E-2
32 KOUNT=KOUNT+1
P=Q(NRAN+1)
R=ABS(E(NRAN))
C
C TEST FOR CONVERGENCE
IF(R-TEPS)30,30,33
33 S=ABS(E(JEND))
C
C IS THERE A REAL ROOT NEXT
IF(S-R)38,38,34
C
C IS DISPLACEMENT SMALL ENOUGH
34 IF(R-TDELT)36,35,35
35 P=0.
36 O=P
DO 37 J=JBEG,NRAN
Q(J)=Q(J)+E(J)-E(J-1)-O
C
C TEST FOR SMALL DIVISOR
IF(ABS(Q(J))-POL(J))81,81,37
37 E(J)=Q(J+1)*E(J)/Q(J)
Q(NRAN+1)=-E(NRAN)+Q(NRAN+1)-O
GOTO 54
C
C CALCULATE DISPLACEMENT FOR DOUBLE ROOTS
C QUADRATIC EQUATION FOR DOUBLE ROOTS
C X**2-(Q(NRAN)+Q(NRAN+1)+E(NRAN))*X+Q(NRAN)*Q(NRAN+1)=0
38 P=0.5*(Q(NRAN)+E(NRAN)+Q(NRAN+1))
O=P*P-Q(NRAN)*Q(NRAN+1)
T=SQRT(ABS(O))
C
C TEST FOR CONVERGENCE
IF(S-TEPS)26,26,39
C
C ARE THERE COMPLEX ROOTS
39 IF(O)43,40,40
40 IF(P)42,41,41
41 T=-T
42 P=P+T
R=S
GOTO 34
C
C MODIFICATION FOR COMPLEX ROOTS
C IS DISPLACEMENT SMALL ENOUGH
43 IF(S-TDELT)44,35,35
C
C INITIALIZATION
44 O=Q(JBEG)+E(JBEG)-P
C
C TEST FOR SMALL DIVISOR
IF(ABS(O)-POL(JBEG))81,81,45
45 T=(T/O)**2
U=E(JBEG)*Q(JBEG+1)/(O*(1.+T))
V=O+U
KOUNT=KOUNT+2
C
C THREEFOLD LOOP FOR COMPLEX DISPLACEMENT
DO 53 J=JBEG,NRAN
O=Q(J+1)+E(J+1)-U-P
C
C TEST FOR SMALL DIVISOR
IF(ABS(V)-POL(J))46,46,49
46 IF(J-NRAN)81,47,81
47 EXPT=EXPT+P
IF(ABS(E(JEND))-TOL)48,48,81
48 P=0.5*(V+O-E(JEND))
O=P*P-(V-U)*(O-U*T-O*W*(1.+T)/Q(JEND))
T=SQRT(ABS(O))
GOTO 26
C
C TEST FOR SMALL DIVISOR
49 IF(ABS(O)-POL(J+1))46,46,50
50 W=U*O/V
T=T*(V/O)**2
Q(J)=V+W-E(J-1)
U=0.
IF(J-NRAN)51,52,52
51 U=Q(J+2)*E(J+1)/(O*(1.+T))
52 V=O+U-W
C
C TEST FOR SMALL DIVISOR
IF(ABS(Q(J))-POL(J))81,81,53
53 E(J)=W*V*(1.+T)/Q(J)
Q(NRAN+1)=V-E(NRAN)
54 EXPT=EXPT+P
TEPS=TEPS*1.1
TDELT=TDELT*1.1
IF(KOUNT-LIMIT)32,55,55
C
C NO CONVERGENCE WITH FEASIBLE TOLERANCE
C ERROR RETURN IN CASE OF UNSATISFACTORY CONVERGENCE
55 IER=1
C
C REARRANGE CALCULATED ROOTS
56 IEND=NSAV-NRAN-1
E(ISTA)=ESAV
IF(IEND)59,59,57
57 DO 58 I=1,IEND
J=ISTA+I
K=NRAN+1+I
E(J)=E(K)
58 Q(J)=Q(K)
59 IR=ISTA+IEND
C
C NORMAL RETURN
60 IR=IR-1
IF(IR)78,78,61
C
C REARRANGE CALCULATED ROOTS
61 DO 62 I=1,IR
Q(I)=Q(I+1)
62 E(I)=E(I+1)
C
C CALCULATE COEFFICIENT VECTOR FROM ROOTS
POL(IR+1)=1.
IEND=IR-1
JBEG=1
DO 69 J=1,IR
ISTA=IR+1-J
O=0.
P=Q(ISTA)
T=E(ISTA)
IF(T)65,63,65
C
C MULTIPLY WITH LINEAR FACTOR
63 DO 64 I=ISTA,IR
POL(I)=O-P*POL(I+1)
64 O=POL(I+1)
GOTO 69
65 GOTO(66,67),JBEG
66 JBEG=2
POL(ISTA)=0.
GOTO 69
C
C MULTIPLY WITH QUADRATIC FACTOR
67 JBEG=1
U=P*P+T*T
P=P+P
DO 68 I=ISTA,IEND
POL(I)=O-P*POL(I+1)+U*POL(I+2)
68 O=POL(I+1)
POL(IR)=O-P
69 CONTINUE
IF(IER)78,70,78
C
C COMPARISON OF COEFFICIENT VECTORS, IE. TEST OF ACCURACY
70 P=0.
DO 75 I=1,IR
IF(C(I))72,71,72
71 O=ABS(POL(I))
GOTO 73
72 O=ABS((POL(I)-C(I))/C(I))
73 IF(P-O)74,75,75
74 P=O
75 CONTINUE
IF(P-TOL)77,76,76
76 IER=-1
77 Q(IR+1)=P
E(IR+1)=0.
78 RETURN
C
C ERROR RETURNS
C ERROR RETURN FOR POLYNOMIALS OF DEGREE LESS THAN 1
79 IER=2
IR=0
RETURN
C
C ERROR RETURN IF THERE EXISTS NO S-FRACTION
80 IER=4
IR=ISTA
GOTO 60
C
C ERROR RETURN IN CASE OF INSTABLE QD-ALGORITHM
81 IER=3
GOTO 56
END